/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wasolicitudesfiec.Administracion.Usuarios;

import com.sun.data.provider.impl.FieldKeySortCriteria;
import com.sun.rave.web.ui.appbase.AbstractPageBean;
import com.sun.rave.web.ui.component.AddRemove;
import com.sun.rave.web.ui.component.Button;
import com.sun.rave.web.ui.component.Checkbox;
import com.sun.rave.web.ui.component.Form;
import com.sun.rave.web.ui.component.HiddenField;
import com.sun.rave.web.ui.component.TextField;
import com.sun.rave.web.ui.model.DefaultOptionsList;
import com.sun.rave.web.ui.model.MultipleSelectOptionsList;
import com.sun.rave.web.ui.model.Option;
import entidad.Persona;
import entidad.Rol;
import entidad.Usuario;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.FacesException;
import javax.faces.application.FacesMessage;
import javax.faces.convert.IntegerConverter;
import javax.servlet.http.HttpServletResponse;
import wasolicitudesfiec.SessionBean1;
import wasolicitudesfiec.RequestBean1;
import wasolicitudesfiec.ApplicationBean1;
import wasolicitudesfiec.Menu;
import wasolicitudesfiec.authentication.AuthenticationPhaseListener;
import wasolicitudesfiec.general.MensajeException;
import wasolicitudesfiec.logicacontrol.CTRL_Base;
import wasolicitudesfiec.logicacontrol.Logica;
import web.util.Constantes;
import web.util.ManejadorCookies;

/**
 * <p>Page bean that corresponds to a similarly named JSP page.  This
 * class contains component definitions (and initialization code) for
 * all components that you have defined on this page, as well as
 * lifecycle methods and event handlers where you may add behavior
 * to respond to incoming events.</p>
 *
 * @version MantenimientoUsuario.java
 * @version Created on 18-ene-2009, 10:39:39
 * @author Administrador
 */
public class MantenimientoUsuario extends AbstractPageBean {

	private HttpServletResponse response;
	private String contextPath;
	// <editor-fold defaultstate="collapsed" desc="Managed Component Definition">

	/**
	 * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
	 * This method is automatically generated, so any user-specified code inserted
	 * here is subject to being replaced.</p>
	 */
	private void _init() throws Exception {
	}
	private IntegerConverter integerConverter1 = new IntegerConverter();

	public IntegerConverter getIntegerConverter1() {
		return integerConverter1;
	}

	public void setIntegerConverter1(IntegerConverter ic) {
		this.integerConverter1 = ic;
	}
	private TextField txtUsuario = new TextField();

	public TextField getTxtUsuario() {
		return txtUsuario;
	}

	public void setTxtUsuario(TextField tf) {
		this.txtUsuario = tf;
	}
	private TextField txtNombre = new TextField();

	public TextField getTxtNombre() {
		return txtNombre;
	}

	public void setTxtNombre(TextField tf) {
		this.txtNombre = tf;
	}
	private TextField txtApellido = new TextField();

	public TextField getTxtApellido() {
		return txtApellido;
	}

	public void setTxtApellido(TextField tf) {
		this.txtApellido = tf;
	}
	private TextField txtCorreo = new TextField();

	public TextField getTxtCorreo() {
		return txtCorreo;
	}

	public void setTxtCorreo(TextField tf) {
		this.txtCorreo = tf;
	}
	private TextField txtCédula = new TextField();

	public TextField getTxtCédula() {
		return txtCédula;
	}

	public void setTxtCédula(TextField tf) {
		this.txtCédula = tf;
	}
	private TextField txtTituloAcademico = new TextField();

	public TextField getTxtTituloAcademico() {
		return txtTituloAcademico;
	}

	public void setTxtTituloAcademico(TextField tf) {
		this.txtTituloAcademico = tf;
	}
	private Button btnGuardar = new Button();

	public Button getBtnGuardar() {
		return btnGuardar;
	}

	public void setBtnGuardar(Button b) {
		this.btnGuardar = b;
	}
	private Button btnEliminar = new Button();

	public Button getBtnEliminar() {
		return btnEliminar;
	}

	public void setBtnEliminar(Button b) {
		this.btnEliminar = b;
	}
	private int idUsuario = -1;

	/**
	 * @return the idUsuario
	 */
	public int getIdUsuario() {
		return idUsuario;
	}

	/**
	 * @param idUsuario the idUsuario to set
	 */
	public void setIdUsuario(int idUsuario) {
		this.idUsuario = idUsuario;
	}

	/**
	 * <p>Return a reference to the scoped data bean.</p>
	 *
	 * @return reference to the scoped data bean
	 */
	protected SessionBean1 getSessionBean1() {
		return (SessionBean1) getBean("SessionBean1");
	}

	/**
	 * <p>Return a reference to the scoped data bean.</p>
	 *
	 * @return reference to the scoped data bean
	 */
	protected RequestBean1 getRequestBean1() {
		return (RequestBean1) getBean("RequestBean1");
	}

	/**
	 * <p>Return a reference to the scoped data bean.</p>
	 *
	 * @return reference to the scoped data bean
	 */
	protected ApplicationBean1 getApplicationBean1() {
		return (ApplicationBean1) getBean("ApplicationBean1");
	}

	public Menu getMenu() {
		return (Menu) getBean("SolicitudesFIEC$Menu");
	}

	private Logica logica;
	private HiddenField txtIdUsuario = new HiddenField();

	public HiddenField getTxtIdUsuario() {
		return txtIdUsuario;
	}

	public void setTxtIdUsuario(HiddenField hf) {
		this.txtIdUsuario = hf;
	}
	private Form form1 = new Form();

	public Form getForm1() {
		return form1;
	}

	public void setForm1(Form f) {
		this.form1 = f;
	}
	private MultipleSelectOptionsList addRemoveList1DefaultOptions = new MultipleSelectOptionsList();

	public MultipleSelectOptionsList getAddRemoveList1DefaultOptions() {
		return addRemoveList1DefaultOptions;
	}

	public void setAddRemoveList1DefaultOptions(MultipleSelectOptionsList msol) {
		this.addRemoveList1DefaultOptions = msol;
	}
	private AddRemove addRemoveList1 = new AddRemove();

	public AddRemove getAddRemoveList1() {
		return addRemoveList1;
	}

	public void setAddRemoveList1(AddRemove ar) {
		this.addRemoveList1 = ar;
	}
    private Checkbox cbActivar = new Checkbox();

    public Checkbox getCbActivar() {
        return cbActivar;
    }

    public void setCbActivar(Checkbox c) {
        this.cbActivar = c;
    }
	// </editor-fold>

	/**
	 * <p>Construct a new Page bean instance.</p>
	 */
	public MantenimientoUsuario() {
	}

	/**
	 * <p>Callback method that is called whenever a page is navigated to,
	 * either directly via a URL, or indirectly via page navigation.
	 * Customize this method to acquire resources that will be needed
	 * for event handlers and lifecycle methods, whether or not this
	 * page is performing post back processing.</p>
	 *
	 * <p>Note that, if the current request is a postback, the property
	 * values of the components do <strong>not</strong> represent any
	 * values submitted with this request.  Instead, they represent the
	 * property values that were saved for this view when it was rendered.</p>
	 */
	@Override
	public void init() {
		// Perform initializations inherited from our superclass
		super.init();
		// Perform application initialization that must complete
		// *before* managed components are initialized
		// TODO - add your own initialiation code here

		// <editor-fold defaultstate="collapsed" desc="Managed Component Initialization">
		// Initialize automatically managed components
		// *Note* - this logic should NOT be modified
		try {
			_init();
		} catch (Exception e) {
			log("MantenimientoUsuario Initialization Failure", e);
			throw e instanceof FacesException ? (FacesException) e : new FacesException(e);
		}

		// </editor-fold>
		// Perform application initialization that must complete
		// *after* managed components are initialized
         Usuario usuario = (Usuario) getSessionMap().get(AuthenticationPhaseListener.USER_SESSION_KEY);
        logica = new Logica();
        FacesMessage message;
        String nombreRol = Constantes.Rol.Administrador.getNombreEnBD();
        try {
            Persona persona = logica.leerPersonaPorUsuario(usuario.getUsuario());
            if (!logica.isUsuarioMiembrodeRol(persona.getIdPersona(), nombreRol)) {
                CTRL_Base ctrl = new CTRL_Base(this.getFacesContext());
                ctrl.addCookieMensaje(Constantes.Mensajes.noAdministrador, null);
                ctrl.redireccionar("/WA_SolicitudesFIEC/faces/general/Mensaje.jsp");
            }

        } catch (SQLException ex) {
            Logger.getLogger(MantenimientoUsuario.class.getName()).log(Level.SEVERE, null, ex);
            message = new FacesMessage(FacesMessage.SEVERITY_FATAL, ex.getMessage(), "");
            getFacesContext().addMessage(null, message);
        }
		getMenu().setTitulo("Mantenimiento de Usuario");
		response = (HttpServletResponse) getFacesContext().getExternalContext().getResponse();
		contextPath = getFacesContext().getExternalContext().getRequestContextPath();
		String[] lstIdUsuario = getFacesContext().getExternalContext().getRequestParameterValuesMap().get("idUsuario");
		if (lstIdUsuario != null && lstIdUsuario.length > 0) {
			setIdUsuario(Integer.parseInt(lstIdUsuario[0]));
			if (!isPostBack()) {
				cargarUsuario(Integer.parseInt(lstIdUsuario[0]));
			}
		}
		//Cargar la lista de todos los Roles del sistema
		Vector<Rol> roles = null;
		Option[] options;
		try {
			roles = logica.leerRoles();
		} catch (SQLException ex) {
			Logger.getLogger(MantenimientoUsuario.class.getName()).log(Level.SEVERE, null, ex);
			message = new FacesMessage(FacesMessage.SEVERITY_ERROR, ex.getMessage(), "");
			getFacesContext().addMessage(null, message);
		}

		if (roles != null) {
			options = new Option[roles.size()];
			for (int i = 0; i < roles.size(); i++) {
				Rol rol = roles.elementAt(i);
				options[i] = new Option(rol.getIdRol(), rol.getRol());
			}
		} else {
			options = new Option[0];
		}

		getAddRemoveList1DefaultOptions().setOptions(options);


	}

	/**
	 * <p>Callback method that is called after the component tree has been
	 * restored, but before any event processing takes place.  This method
	 * will <strong>only</strong> be called on a postback request that
	 * is processing a form submit.  Customize this method to allocate
	 * resources that will be required in your event handlers.</p>
	 */
	@Override
	public void preprocess() {
		System.out.println("preprocess");
		System.out.println("getTxtIdUsuario().getValue()" + getTxtIdUsuario().getValue());
	}

	/**
	 * <p>Callback method that is called just before rendering takes place.
	 * This method will <strong>only</strong> be called for the page that
	 * will actually be rendered (and not, for example, on a page that
	 * handled a postback and then navigated to a different page).  Customize
	 * this method to allocate resources that will be required for rendering
	 * this page.</p>
	 */
	@Override
	public void prerender() {
		System.out.println("prerender");
//		System.out.println("getTxtIdUsuario().getValue()" + getTxtIdUsuario().getValue());
//		Object obj[] = (Object[]) getAddRemoveList1DefaultOptions().getSelectedValue();
//		Object[] arrRoles = new Object[obj.length];
//		for (int i = 0; i < obj.length; i++) {
//			arrRoles[i] = (Integer) obj[i];
//		}
//		printSelectedValue();
	}

	/**
	 * <p>Callback method that is called after rendering is completed for
	 * this request, if <code>init()</code> was called (regardless of whether
	 * or not this was the page that was actually rendered).  Customize this
	 * method to release resources acquired in the <code>init()</code>,
	 * <code>preprocess()</code>, or <code>prerender()</code> methods (or
	 * acquired during execution of an event handler).</p>
	 */
	@Override
	public void destroy() {
	}

	@Override
	protected void afterApplyRequestValues() {
		super.afterApplyRequestValues();
		System.out.println("afterApplyRequestValues");
		System.out.println("getTxtIdUsuario().getValue()" + getTxtIdUsuario().getValue());
//		if (getTxtIdUsuario().getValue()!=null){
//			cargarUsuario((Integer)getTxtIdUsuario().getValue());
//		}
	}

	protected void cargarUsuario(int idUsuario) {
		FacesMessage message;
		Vector<Rol> listaRoles = new Vector<Rol>();
		try {
			Persona persona = logica.leerPersona(idUsuario);
			listaRoles = logica.leerVariosRolPorIdPersona(idUsuario);
			System.out.println("Persona: " + persona);
			if (persona == null) {
				throw new MensajeException("La persona que busca no existe");
			}
			getTxtApellido().setValue(persona.getApellidos());
			getTxtCorreo().setValue(persona.getCorreo());
			getTxtCédula().setValue(persona.getCedula());
			getTxtNombre().setValue(persona.getNombres());
			getTxtTituloAcademico().setValue(persona.getTituloAcademico());
			getTxtUsuario().setValue(persona.getUsuario());
            getCbActivar().setValue(persona.isActivo());

			Object arrRoles[] = new Object[listaRoles.size()];
			if (!isPostBack()) {
				for (int i = 0; i < listaRoles.size(); i++) {
					arrRoles[i] = listaRoles.get(i).getIdRol();
				}
			}

			getAddRemoveList1DefaultOptions().setSelectedValue(arrRoles);

			System.out.println("cargarUsuario: ");
			printSelectedValue();
		} catch (SQLException ex) {
			Logger.getLogger(MantenimientoUsuario.class.getName()).log(Level.SEVERE, null, ex);
			message = new FacesMessage(FacesMessage.SEVERITY_ERROR, ex.getMessage(), "");
			getFacesContext().addMessage(null, message);
			getBtnGuardar().setDisabled(true);
			getBtnEliminar().setDisabled(true);
		} catch (MensajeException ex) {
			message = new FacesMessage(FacesMessage.SEVERITY_WARN, ex.getMessage(), "");
			getFacesContext().addMessage(null, message);
			getBtnGuardar().setDisabled(true);
			getBtnEliminar().setDisabled(true);
		}
	}

	public String btnGuardar_action() {
		Persona persona;
		Vector<Rol> roles;
		try {
			if (getIdUsuario() > 0) {

				persona = logica.leerPersona(getIdUsuario());
			} else {
				persona = new Persona();
			}
			persona.setApellidos((String) getTxtApellido().getValue());
			persona.setCorreo((String) getTxtCorreo().getValue());
			persona.setCedula((String) getTxtCédula().getValue());
			persona.setNombres((String) getTxtNombre().getValue());
			persona.setTituloAcademico((String) getTxtTituloAcademico().getValue());
			persona.setUsuario((String) getTxtUsuario().getValue());
            persona.setActivo(getCbActivar().getValue()!=null ? (Boolean)getCbActivar().getValue(): false);

			System.out.println("guardar usuario");
			printSelectedValue();
			Object[] objIdRol = (Object[]) getAddRemoveList1DefaultOptions().getSelectedValue();
			Integer[] idRol = new Integer[objIdRol.length];
			System.out.println("idRol: " + idRol.toString());
			System.out.println("objIdRol: " + objIdRol.toString());
			System.arraycopy(objIdRol, 0, idRol, 0, objIdRol.length);
			logica.guardarPersona(persona, idRol);
			ManejadorCookies.agregarCookieMensaje(response, "El usuario fue guardado satisfactoriamente", contextPath + "/faces/Administracion/Usuarios/");
			return "guardarUsuario";
		} catch (SQLException ex) {
			Logger.getLogger(MantenimientoUsuario.class.getName()).log(Level.SEVERE, null, ex);
		}
		return null;
	}

	public void printSelectedValue() {
		Object obj[] = (Object[]) getAddRemoveList1DefaultOptions().getSelectedValue();
		if (obj != null) {
			for (int i = 0; i < obj.length; i++) {
				Object object = obj[i];
				System.out.println("object: " + object);
				System.out.println(object != null ? object.getClass().getName() : "");
			}
		} else {
			System.out.println("Es null");
		}
		System.out.println("fin********");
	}

	public String btnEliminar_action() {
		// TODO: Process the button click action. Return value is a navigation
		// case name where null will return to the same page.
		return null;
	}
}

